/*
 * @Author: error: error: git config user.name & please set dead value or install git && error: git config user.email & please set dead value or install git & please set dead value or install git
 * @Date: 2025-02-10 13:44:21
 * @LastEditors: error: error: git config user.name & please set dead value or install git && error: git config user.email & please set dead value or install git & please set dead value or install git
 * @LastEditTime: 2025-02-10 15:58:55
 * @FilePath: \csgz_code\menu.c
 * @Description: 这是默认设置,请设置`customMade`, 打开koroFileHeader查看配置 进行设置: https://github.com/OBKoro1/koro1FileHeader/wiki/%E9%85%8D%E7%BD%AE
 */
#include <stdio.h>
#include <sys/time.h>
#include <sys/types.h>
#include <unistd.h>
#include <string.h>
#include "./include/menu.h" 
#include "./include/serial_test.h" 
#include "./include/can_test.h" 
#include "./include/io_test.h"
#include "./include/adda_test.h"
#include "./include/tcp_sxx.h"
#include "./include/protocol.h"
#include "./include/udp_sxx.h"
#include "../include/test_hardware.h"
void choice_target(char* ip_addr)
{
    char str[128];
    int choice;
    while(1)
    {
        printf("==============================\n");
        printf("  <控制计算机> 自动化测试产品功能 \n");
        printf("==============================\n");
        printf("1. 测试 Vxworks\t(%s)\n",target_vxworks_ips);
        printf("2. 测试 天脉\t(%s)\n",target_tianmai_ips);
        printf("3. 退出\n");
        printf("==============================\n");
        printf("请输入指令编号：");

        if (scanf("%d", &choice) != 1) 
        {
            // 错误输入处理
            printf("无效的输入，请输入数字\n");
            // 清除输入缓冲区
            while(getchar() != '\n');
        }
        if( choice == 1 )
        {
            memcpy( source_ips[0], source_vxworks_ips[0], 16 );
            memcpy( source_ips[1], source_vxworks_ips[1], 16 );
            memcpy( source_ips[2], source_vxworks_ips[2], 16 );
            memcpy( target_ips[0], target_vxworks_ips[0], 16 );
            memcpy( target_ips[1], target_vxworks_ips[1], 16 );
            memcpy( target_ips[2], target_vxworks_ips[2], 16 );
            tcp_port = Vxworks_PORT;
        }
        else if( choice == 2 )
        {
            memcpy( source_ips[0], source_tianmai_ips[0], 16 );
            memcpy( source_ips[1], source_tianmai_ips[1], 16 );
            memcpy( source_ips[2], source_tianmai_ips[2], 16 );
            memcpy( target_ips[0], target_tianmai_ips[0], 16 );
            memcpy( target_ips[1], target_tianmai_ips[1], 16 );
            memcpy( target_ips[2], target_tianmai_ips[2], 16 );
            tcp_port = TianMai_PORT;
        }
        if( choice == 1 || choice == 2 )
        {
            memcpy( ip_addr, target_ips[0], 16 );
            system( "ifconfig eth0 down" );
            sleep(1);
            sprintf( str,"ifconfig eth0:0 %s netmask 255.255.255.0", source_ips[0] );
            system( str );
            usleep(10000);
            sprintf( str,"ifconfig eth0:1 %s netmask 255.255.255.0", source_ips[1] );
            system( str );
            usleep(10000);
            sprintf( str,"ifconfig eth0:2 %s netmask 255.255.255.0", source_ips[2] );
            system( str );
            usleep(10000);
            system( "ifconfig eth0 up" );
            usleep(10000);
            break;
            
        }

        // 退出程序选项
        if (choice == 3) 
        {
            break ;
        }
    }
}
void show_menu() 
{
    printf("==============================\n");
    printf("  <控制计算机> 自动化测试产品功能 \n");
    printf("==============================\n");
    printf("1. 测试 所有接口\n");
    printf("2. 测试 硬件资源\n");
    printf("3. 测试 所有串口\t(16 路)\n");
    printf("4. 测试 CAN 总线 \t( 2 路)\n");
    printf("5. 测试 所有离散量\t(128路)\n");
    printf("6. 测试 AD/DA转换\t(16 路)\n");
    printf("7. 测试 所有网口\t( 2 路)\n");
    printf("8. 退出\n");
    printf("==============================\n");
    printf("请输入指令编号：");
}

static void show_menu_choice_io_test()
{
    printf("==============================\n");
    printf("  自动化测试离散量\n");
    printf("==============================\n");
    printf( "1.  控制第 0-47路 输出高电平;\n"
            "    控制第 48  路 5V/地，母线/脐带输出高电平;\n"
            "    控制第49-56路 4路磁保持吸合;\n"
            "    控制第58-59路 输出高电平;\n"
            "    控制第61-63路 快速IO输出高电平。\n"
            "\n");
    printf( "2.  控制第 0-47路 输出低电平;\n"
            "    控制第 48  路 5V/地，母线/脐带输出低电平;\n"
            "    控制第49-56路 4路磁保持断开;\n"
            "    控制第58-59路 输出低电平;\n"
            "    控制第61-63路 快速IO输出低电平。\n"
            "\n");
    printf( "3.  离散量防粘连测试1\n"
            "    控制第 0-47路 (奇数为低电平,偶数为高电平);\n"
            "    控制第 48  路 5V/地，母线/脐带输出低电平;\n"
            "    控制第49-56路 4路磁保持(奇数为断开,偶数为吸合);\n"
            "    控制第58-59路 (奇数为低电平,偶数为高电平);\n"
            "    控制第61-63路 快速IO(奇数为低电平,偶数为高电平)。\n"
            "\n");
    printf( "4.  离散量防粘连测试2\n"   
            "    控制第 0-47路 (奇数为高电平,偶数为低电平);\n"
            "    控制第 48  路 5V/地，母线/脐带输出高电平;\n"
            "    控制第49-56路 4路磁保持(奇数为吸合,偶数为断开);\n"
            "    控制第58-59路 (奇数为高电平,偶数为低电平);\n"
            "    控制第61-63路 快速IO(奇数为高电平,偶数为低电平)。\n"
            "\n");    
    printf("5. 退出\n");
    printf("==============================\n");
    printf("请输入指令编号：");
}



void wait_scanf(int cmd_fd)
{
    int choice;
    fd_set fds;
    struct timeval tv;
    while (1) 
    {
        fflush(stdout);
        
        // 初始化文件描述符集合
        FD_ZERO(&fds);
        FD_SET(STDIN_FILENO, &fds);  // 监视标准输入
        
        // 设置超时
        tv.tv_sec = TIMEOUT;
        tv.tv_usec = 0;
        
        // 等待输入或超时
        int ret = select(STDIN_FILENO + 1, &fds, NULL, NULL, &tv);
        
        if (ret == -1) 
        {
            perror("select");
            break;
        } 
        else if (ret == 0) 
        {
            recv_tcp_data_discard( cmd_fd, 1 );
            continue;
        }
        break;
    }
}

static void chioce_test_io(int cmd_fd, char* sendbuf)
{
    int choice;
    while (1)
    {
        show_menu_choice_io_test();
        
        wait_scanf( cmd_fd );
        if (scanf("%d", &choice) != 1)
        {
            // 错误输入处理
            printf("无效的输入，请输入数字\n");
            // 清除输入缓冲区
            while(getchar() != '\n');
            continue;
        }
        // 正常处理choice
        printf("您选择了: %d\n", choice);
        // 处理用户选择的选项
        handle_choice_io(choice, cmd_fd, sendbuf);

        // 退出程序选项
        if (choice == 5)
        {
            break;
        }
    }
    return;
}

void test_all(int cmd_fd, char* sendbuf)
{
    test_hardware(cmd_fd,sendbuf);
    test_all_serial_ports();
    test_can_bus(cmd_fd);
    handle_choice_io(3,cmd_fd, sendbuf );
    handle_choice_io(4,cmd_fd, sendbuf );
    handle_choice_io(1,cmd_fd, sendbuf );
    handle_choice_io(2,cmd_fd, sendbuf );
    test_adda(cmd_fd,sendbuf);
    test_udp();
}

void handle_choice(int choice, int cmd_fd, char* sendbuf ) 
{
    switch (choice) 
    {
        case 1:
            test_all( cmd_fd, sendbuf );
            break;
        case 2:
            test_hardware(cmd_fd,sendbuf);
            break;
        case 3:
            test_all_serial_ports();
            break;
        case 4:
            test_can_bus(cmd_fd);
            break;
        case 5:
            chioce_test_io(cmd_fd, sendbuf );
            break;
        case 6:
            test_adda(cmd_fd,sendbuf);
            break;
        case 7:
            test_udp();
            break;
        case 8:
            return;
        default:
            printf("无效选项，请重新输入\n");
            return;
    }
    return ;
}
